package com.spzx.product.api;

import com.spzx.common.core.constant.SecurityConstants;
import com.spzx.common.core.constant.ServiceNameConstants;
import com.spzx.common.core.domain.R;
import com.spzx.product.api.factory.RemoteProductFallbackFactory;
import com.spzx.product.api.model.ProductSku;
import com.spzx.product.vo.SkuPriceVo;
import io.swagger.v3.oas.annotations.Operation;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 所有OpenFeign使用注解@FeignClient，被扫描产生代理对象，由代理对象使用ReqeustTemplate发起Http请求
 * 1.接口上配置信息得到请求地址：http://spzx-product/业务接口基础URL地址
 * 2.Openfeign接口方法从controller复制而来 http://spzx-product/业务接口基础URL地址/getProductSku/{skuId}
 * 3.发送请求调用目标服务，上游微服务会从Nacos根据服务名称“spzx-product”得到该服务下实例列表
 * 实例1：192.168.200.38：9205
 * 实例2：192.168.200.38：9105
 * 4.OpenFeign集成客户端负载均衡组件：LoadBalancer组件，默认采用轮询负载均衡策略
 * 5.请求一：http://192.168.200.38:9205/业务接口基础URL地址/getProductSku/{skuId}
 * 请求二：http://192.168.200.38:9105/业务接口基础URL地址/getProductSku/{skuId}
 */

@FeignClient(
        value = ServiceNameConstants.PRODUCT_SERVICE,
        path = "/productSku", //业务接口基础URL地址
        fallbackFactory = RemoteProductFallbackFactory.class  //确保被IOC容器扫描注册对象
)
public interface RemoteProductService {

    @Operation(summary = "获取商品SKU详情")
    @GetMapping("/getProductSku/{skuId}")
    public R<ProductSku> getProductSku(@PathVariable("skuId") Long skuId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);


    @Operation(summary = "批量获取商品sku最新价格信息")
    @PostMapping(value = "/getSkuPriceList")
    public R<List<SkuPriceVo>> getSkuPriceList(@RequestBody List<Long> skuIdList, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    @Operation(summary = "获取商品sku最新价格信息")
    @GetMapping(value = "/getSkuPrice/{skuId}")
    public R<SkuPriceVo> getSkuPrice(@PathVariable("skuId") Long skuId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
}
